package magazzino.web.riceviOrdine;

import java.util.List;
import javax.ejb.EJB;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.actions.EventDispatchAction;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

import to.pm.entity.acquisti.OrdineEsterno;
import magazzino.web.GestioneRicezioneHelper;
import to.pm.acquisti.bi.GestioneOrdineBusiness;
import to.pm.catalogo.bi.GestioneCatalogoBusiness;
import to.pm.ejb.EjbName;
import to.pm.entity.acquisti.DOECategoria;
import to.pm.entity.acquisti.DettaglioOrdineEsterno;
import to.pm.entity.catalogo.Categoria;
import to.pm.entity.catalogo.Prodotto;
import to.pm.entity.magazzino.DettaglioRicezione;
import to.pm.magazzino.bi.RicezioneBusiness;


public class RiceviOrdineAction extends EventDispatchAction {
    
    private final static String CONFERMA = "conferma";
    private final static String ANNULLA = "annulla";

    private final static String FAILURE = "failure";


    @EJB(mappedName=EjbName.OrdineEsternoBean)
    private GestioneOrdineBusiness ordine;

    @EJB //(mappedName=EjbName.CatalogoBean)
    private GestioneCatalogoBusiness catalogo;

    @EJB
    private RicezioneBusiness ricezione;

    public ActionForward annulla(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        ((RiceviOrdineForm)form).myReset();
        
        return mapping.findForward(ANNULLA);
    }


    public ActionForward salva(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
            return caricaForm(mapping, form, request, response);
    }

     public ActionForward conferma(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

         log.info("RiceviOrdineAction::conferma(...)");
         RiceviOrdineForm myForm = (RiceviOrdineForm) form;

         OrdineEsterno oe=GestioneRicezioneHelper.testAndGetOrdineEsterno(request);
         oe =  ordine.recuperaInfo(oe);
         //iniziamo la ricezione
         ricezione.iniziaRicezione(oe);

         //per ogni dettaglio dell'ordine
         log.info("OrdineEsterno: "+oe);
         for (DettaglioOrdineEsterno doe: oe.getDettaglio()) {
             //si recupera la quantita ricevuta
             String sq =  myForm.getQuantita(doe.getId().toString()) ;
             int iq = Integer.parseInt(sq);
             //se la quantita e' maggiore di zero, nuovo dettaglioricezione
             log.info("sq:"+sq+"iq:"+iq+" doe:"+doe);
             if (iq > 0) {
                Prodotto p = null;
                if (doe.getIsCategoria()) {
                    long idProdotto = Long.parseLong(myForm.getProdotto(doe.getId().toString()));
                    p = catalogo.findProdottoById(idProdotto);
                }
                log.info("ricezione:"+doe+" p:"+p+" iq:"+iq);
                ricezione.riceviDettaglio(doe, p, iq);
             }
         }

        ricezione.confermaRicezione();
        myForm.myReset();
        return mapping.findForward(CONFERMA);
    }

    public ActionForward caricaForm(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {

        RiceviOrdineForm myForm = (RiceviOrdineForm) form;

        OrdineEsterno oe = null;
        if ((oe=GestioneRicezioneHelper.testAndGetOrdineEsterno(request))!=null) {

            oe =  ordine.recuperaInfo(oe);
            request.setAttribute("ordine", oe);

            //Per i DOE di tipo categoria, inserire lista prodotti possibili
            for (DettaglioOrdineEsterno d : oe.getDettaglio()) {
                if (d.getIsCategoria()) {
                    DOECategoria doec = (DOECategoria)d;
                    Categoria cat = doec.getCategoria();
                    List<? extends Prodotto> lp = catalogo.findProdottiByCategoria(doec.getCategoria());
                    //
                        log.info("lp by findCategoria: " + cat);
                        for(Prodotto p:lp) {
                            log.info("Prodotto in lp: " + p);
                        }
                        log.info("indice in map:" + doec.getId().toString());
                    //
                    myForm.setProdottiInCategoria(doec.getId().toString(), lp);
                }
            }
            return mapping.getInputForward();
            
        } else {

            return mapping.findForward(FAILURE);
        }
    }
}